package general

import (
	"errors"
	"strconv"
)

// 比较值，字符串数值转数值比较，或者就是字符串比较是否相等
func ComparatorOutRange(value string, standardValue string, comparisonSymbol string) (string, error) {
	// 尝试将 standardValue 转换为浮动型，如果转换失败则认为它是字符串
	correctValue, err := tryParseFloat(standardValue)
	if err == nil {
		// 如果 standardValue 是数字，继续进行数值比较
		comparedValue, err := tryParseFloat(value)
		if err != nil {
			if comparisonSymbol != "=" {
				return "-1", errors.New("字符串数值无法比较大小")
			}
			// 如果是等号比较，直接判断两个字符串是否相等
			if value == standardValue {
				return "1", nil
			}
			return "0", nil
		}

		// 根据 comparisonSymbol 进行数值比较
		return compareNumeric(comparedValue, correctValue, comparisonSymbol)
	}

	// 如果 standardValue 不是数字，判断是否允许进行字符串比较
	if comparisonSymbol != "==" && comparisonSymbol != "!=" {
		return "-1", errors.New("字符串只能进行 '==' 或 '!=' 比较")
	}

	return compareStr(value, standardValue, comparisonSymbol)
}

func compareStr(comparedValue, correctValue, comparisonSymbol string) (string, error) {
	var result bool
	// 如果是字符串比较，直接进行比较
	switch comparisonSymbol {
	case "==":
		result = comparedValue == correctValue
	case "!=":
		result = comparedValue != correctValue
	default:
		return "-1", errors.New("不支持的比较符号")
	}
	if !result {
		return "0", nil
	}

	return "1", nil
}

// tryParseFloat 尝试将输入的值转换为浮动型，如果失败则尝试解析为整数
func tryParseFloat(value string) (float64, error) {
	// 尝试解析为浮动型
	floatValue, err := strconv.ParseFloat(value, 64)
	if err == nil {
		return floatValue, nil
	}

	// 如果解析失败，再尝试将其解析为整数
	intValue, err := strconv.Atoi(value)
	if err != nil {
		return 0, errors.New("无法将值转换为有效的数值类型")
	}

	// 如果是整数，返回其浮动值
	return float64(intValue), nil
}

// compareNumeric 根据比较符号比较两个数值
func compareNumeric(comparedValue, correctValue float64, comparisonSymbol string) (string, error) {
	var result bool

	// 根据 comparisonSymbol 进行数值比较
	switch comparisonSymbol {
	case "<":
		result = comparedValue < correctValue
	case "<=":
		result = comparedValue <= correctValue
	case ">":
		result = comparedValue > correctValue
	case ">=":
		result = comparedValue >= correctValue
	case "==":
		result = comparedValue == correctValue
	case "!=":
		result = comparedValue != correctValue
	default:
		return "-1", errors.New("不支持的比较符号")
	}

	if !result {
		return "0", nil
	}

	return "1", nil
}
